home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
ada
/
gnat1792.zip
/
gnat179b
/
t-adainc
/
a-strfix.adb
< prev
next >
Wrap
Text File
|
1994-05-19
|
15KB
|
498 lines
------------------------------------------------------------------------------
-- --
-- GNAT RUNTIME COMPONENTS --
-- --
-- A D A . S T R I N G S . F I X E D --
-- --
-- B o d y --
-- --
-- $Revision: 1.3 $ --
-- --
-- Copyright (c) 1992,1993,1994 NYU, All Rights Reserved --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 2, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General --
-- Public License distributed with GNAT; see file COPYING. If not, write --
-- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
-- --
------------------------------------------------------------------------------
-- Note: This code is derived from the ADAR.CSH public domain Ada 83
-- versions of the Appendix C string handling packages. One change is
-- to avoid the use of Is_In, so that we are not dependent on inlining.
-- Note that the search function implementations are to be found in the
-- auxiliary package Ada.Strings.Search. Also the Move procedure is
-- directly incorporated (ADAR used a subunit for this procedure)
package body Ada.Strings.Fixed is
-----------------------
-- Local Subprograms --
-----------------------
function Max (Item_1, Item_2 : Integer) return Integer;
-- Return maximum of two integers (this should be replaced by use of
-- the 'Max attribute when GNAT implements this attribute ???)
function Max (Item_1, Item_2 : Integer) return Integer is
begin
if Item_1 >= Item_2 then
return Item_1;
else
return Item_2;
end if;
end Max;
---------
-- "*" --
---------
function "*" (Left : in Natural;
Right : in Character) return String
is
Result : String (1 .. Left);
begin
for I in Result'range loop
Result (I) := Right;
end loop;
return Result;
end "*";
function "*" (Left : in Natural;
Right : in String) return String
is
Result : String (1 .. Left * Right'Length);
Ptr : Integer := 1;
begin
for I in 1 .. Left loop
Result (Ptr .. Ptr + Right'Length - 1) := Right;
Ptr := Ptr + Right'Length;
end loop;
return Result;
end "*";
------------
-- Delete --
------------
function Delete (Source : in String;
From : in Positive;
Through : in Natural)
return String
is
Result : String (1 .. Source'Length - Max (Through - From + 1, 0));
begin
if From not in Source'range or else Through > Source'Last then
raise Index_Error;
end if;
Result := Source (Source'First .. From - 1) &
Source (Through + 1 .. Source'Last);
return Result;
end Delete;
procedure Delete (Source : in out String;
From : in Positive;
Through : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Fixed.Pad) is
begin
Move (Source => Delete (Source, From, Through),
Target => Source,
Justify => Justify,
Pad => Pad);
end Delete;
----------
-- Head --
----------
function Head (Source : in String;
Count : in Natural;
Pad : in Character := Fixed.Pad)
return String
is
Result : String (1 .. Count);
begin
if Count < Source'Length then
Result := Source (Source'First .. Source'First + Count - 1);
else
Result (1 .. Source'Length) := Source;
for I in Source'Length + 1 .. Count loop
Result (I) := Pad;
end loop;
end if;
return Result;
end Head;
------------
-- Insert --
------------
function Insert (Source : in String;
Before : in Positive;
New_Item : in String)
return String
is
Result : String (1 .. Source'Length + New_Item'Length);
begin
if Before < Source'First or else Before > Source'Last + 1 then
raise Index_Error;
end if;
Result := Source (Source'First .. Before - 1) & New_Item &
Source (Before .. Source'Last);
return Result;
end Insert;
procedure Insert (Source : in out String;
Before : in Positive;
New_Item : in String;
Drop : in Truncation := Error) is
begin
Move (Source => Insert (Source, Before, New_Item),
Target => Source,
Drop => Drop);
end Insert;
----------
-- Move --
----------
procedure Move (Source : in String;
Target : out String;
Drop : in Truncation := Error;
Justify : in Alignment := Left;
Pad : in Character := Ada.Strings.Fixed.Pad)
is
Sfirst : constant Integer := Source'First;
Slast : constant Integer := Source'Last;
Slength : constant Integer := Source'Length;
Tfirst : constant Integer := Target'First;
Tlast : constant Integer := Target'Last;
Tlength : constant Integer := Target'Length;
function Is_Padding (Item : String) return Boolean is
begin
for I in Item'range loop
if Item (I) /= Pad then
return False;
end if;
end loop;
return True;
end Is_Padding;
-- Start of processing for Move
begin
if Slength = Tlength then
Target := Source;
elsif Slength > Tlength then
case Drop is
when Left =>
Target := Source (Slast - Tlength + 1 .. Slast);
when Right =>
Target := Source (Sfirst .. Sfirst + Tlength - 1);
when Error =>
case Justify is
when Left =>
if Is_Padding (Source (Sfirst + Tlength .. Slast)) then
Target :=
Source (Sfirst .. Sfirst + Target'Length - 1);
else
raise Length_Error;
end if;
when Right =>
if Is_Padding (Source (Sfirst .. Slast - Tlength)) then
Target := Source (Slast - Tlength + 1 .. Slast);
else
raise Length_Error;
end if;
when Center =>
raise Length_Error;
end case;
end case;
else -- Source'Length < Target'Length
case Justify is
when Left =>
Target (Tfirst .. Tfirst + Slength - 1) := Source;
for I in Tfirst + Slength .. Tlast loop
Target (I) := Pad;
end loop;
when Right =>
for I in Tfirst .. Tlast - Slength loop
Target (I) := Pad;
end